/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author Lenh Ho Xung
 */
public class MSSQLConnect implements Cloneable {

    public String host = ""; // thông tin host của database Server mình kết nối tới
    public int port = 1433; //thông tin cổng kết nối của MSSQL
    public String userName = ""; // thông tin tên đăng nhập của database server
    public String passWord = ""; // thông tin mật khẩu của database server
    public String dataBase = ""; // tên của database mình kết nối
    Connection connect = null; // khởi tảo connection bằng null
    ResultSet result = null; // khởi tạo statement để thực thi câu lệnh SQL
    Statement statement = null; // khởi tạo ResultSet chứa dữ liệu khi thực thi

    // hàm khởi tạo và truyền thông tin của Database Server
    // Hàm kiểm tra xem Driver connect MSSQL đã sẵn sàng chưa
    public MSSQLConnect(){
    host = "localhost"; // thông tin host của database Server mình kết nối tới
    port = 1433; //thông tin cổng kết nối của MSSQL
    userName = "sa"; // thông tin tên đăng nhập của database server
    passWord = "123456"; // thông tin mật khẩu của database server
    dataBase = "QUANLYKHACHSAN"; // tên của database mình kết nối
    }
    public MSSQLConnect(String host, String userName, String passWord, String dataBase){
        this.host=host;
        this.userName=userName;
        this.passWord=passWord;
        this.dataBase=dataBase;
        this.port=1433;
        
    }
    protected void driverTest() throws Exception {
        try {
            // kiểm tra class name
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

        } // nếu chưa có driver thì ném lỗi ra ngoài
        catch (ClassNotFoundException e) {
            throw new Exception("MSSQL JDBC Driver not found");

        }
    }

    // Hàm lấy connection
    public Connection getConnect() throws Exception {
        // nếu connection null thì khởi tạo mới
        if (this.connect == null) {
            driverTest();
        }

        try {
            // tạo Connection thông qua url
            SQLServerDataSource ds = new SQLServerDataSource();
            ds.setUser(this.userName);
            ds.setPassword(this.passWord);
            ds.setServerName(this.host);
            ds.setPortNumber(this.port);
            ds.setDatabaseName(this.dataBase);
            this.connect = ds.getConnection();

            // nếu không thành công thì ném lỗi ra ngoài    
        } catch (SQLException e) {
            throw new Exception("Không thể kết nối đến Database Server" + e.getMessage());
        }
        // trả về connection
        return this.connect;
    }

    // Hàm tạo statement để thực thi câu truy vấn
    protected Statement getStatement() throws Exception {
        // kiểm tra statement nếu null hoặc đã đóng
        if (this.statement == null ? true : this.statement.isClosed()) {
            // khởi tạo một statement mới
            this.statement = this.getConnect().createStatement();

        }
        // trả về statement
        return this.statement;
    }

    // Hàm thực thi câu lệnh Select lấy dữ liệu từ cơ sở dữ liệu
    public ResultSet excuteQuery(String Query) throws Exception {
        try {
            // thực thi câu lệnh
            this.result = getStatement().executeQuery(Query);
            // nếu không thành công thì ném lỗi ra ngoài
        } catch (Exception e) {
            throw new Exception("Error:" + e.getMessage() + "-" + Query);
        }
        //trả câu lệnh ra ngoài
        return this.result;

    }

    // thực thi các câu lệnh inser, update, delete
    public int executeUpdate(String Query) throws Exception {
        // khai báo biến int lưu trữ kết quả thực thi câu lệnh sql
        int res = Integer.MIN_VALUE;
        try {
            // thực thi câu lệnh

            res = getStatement().executeUpdate(Query);
            //nếu không thành công ném lỗi ra ngoài
        } catch (Exception e) {

            throw new Exception("Error: " + e.getMessage() + "-" + Query);
        } finally {
            // đóng kết nối
            this.clone();
        }
        // trả kết quả ra ngoài
        return res;
    }

    // hàm đóng kết nối
    public void Close() throws SQLException {
        // kiểm tra result và đóng
        if (this.result != null && !this.result.isClosed()) {
            this.result.close();
            this.result = null;
        }
        // kiểm tra và đóng statement
        if (this.statement != null && !this.statement.isClosed()) {
            this.statement.close();
            this.result = null;
        }
        //kiểm tra và đóng connect
        if (this.connect != null && !this.connect.isClosed()) {
            this.connect.close();
            this.connect = null;
        }
    }
}
